function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
}
function Serialize(pRoot)
{
    // write code here
    // 在序列化函数中 我们使用一个列表来记录这个二叉树节点的信息
    var vals = []
    // 定义一个递归的函数 他需要的参数是当前的节点
    function encode(cur){
      if(cur === null) { // 如果说当前的节点是null的 
        vals.push('#') // 我们就在数组的结尾 添加一个特殊的信息 就是#
      }else{ // 否则的话我们将 当前节点的值以字符串的形式存到列表当中
        vals.push(cur.val.toString())
        // 在此之后我们将他的左右子树分别进行一个编码
        encode(cur.left) // 先是左子树
        encode(cur.right) // 然后是右子树
      }
    }
    // 这样这样的递归函数就完成了
    encode(pRoot)
    return vals.join(' ') // 注意他返回的信息是一个字符串 我们用空格作为连接符 将所有的信息连接起来 就返回了一个字符串
}
function Deserialize(s)
{
    // write code here
    // 因为我们的返回结果是用空格连接的 所以我们在这里可以用split函数将其分开
    var vals = s.split(' ') // 将字符串转换成列表
    // 接下来定义解码的递归函数
    let i = 0
    function decode(){
      var val = vals[i]
      i++
      if(val === '#'){
        // 如果说他是空的 也就是说他的信息是警号键
        return null // 那么就返回一个空的节点
      }else{ // 就建立一个新的节点 他的数字就是列表当前项
        var cur = new TreeNode(parseInt(val)) // 将这个值转换成整型
        cur.left = decode() // 最后构建左右子树
        cur.right = decode() // 最后构建左右子树
        // 构建完了之后呢返回当前节点
        return cur
      }
    }
    // 在主函数中调用解码的递归函数
    return decode()
}
module.exports = {
    Serialize : Serialize,
    Deserialize : Deserialize
};